Appearance
JD12 统计每个月兔子的总数
本节目标:理解“JD12 统计每个月兔子的总数”的核心思路,并能把它用于实际开发或面试表达。 简单 通过率:42.58% 时间限制:1秒 空间限制:32M 知识点==查找====排序== 描述 有一种兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第三个月后每个月又生一只兔子。 例子:假设一只兔子第3个月出生,那么它第5个月开始会每个月生一只兔子。 一月的时候有一只兔子,假如兔子都不死,问第n个月的兔子总数为多少? 数据范围:输入满足 1≤�≤31 1≤n≤31 输入描述: 输入一个int型整数表示第n个月 输出描述: 输出对应的兔子总数 示例1 输入: 3 ==复制== 输出: 2
这个问题实际上是斐波那契数列的一个变种,它考察的是每个月兔子的增长情况。在这个问题中,一个兔子从第三个月开始每个月都会生出一个新的兔子,而新生的兔子也会在它们达到第三个月时开始每个月生一个新兔子。这就形成了一个每月都在增长的序列。
解题思路
- 第1个月开始时,有1只成年兔子。
- 第2个月,这只成年兔子还没有生育,所以还是1只兔子。
- 第3个月,这只成年兔子生了第一只小兔子,总数变为2只兔子。
- 从第4个月开始,情况开始变得复杂,因为新生的小兔子在第三个月后也能开始生育。
所以,从第三个月开始,每个月的兔子数量是前两个月兔子数量的和。这是因为:
- 当月的成年兔子(包括上个月就已经是成年的和这个月刚变成成年的)都会生出新的小兔子。
- 所有上个月的兔子(包括成年的和小兔子)在这个月都还活着。
代码实现
下面是一个Python代码实例,使用递归方式计算第n个月的兔子总数:
def rabbit(n):
如果是第一个月或第二个月,直接返回1
if n == 1 or n == 2: return 1
递归调用计算前两个月的兔子总数并相加
else: return rabbit(n-1) + rabbit(n-2)
读取输入
n = int(input())
输出第n个月的兔子总数
print(rabbit(n))
注意:这种递归方法虽然直观,但在n较大时会因为重复计算同一个值而效率低下。对于更高效的解法,可以考虑使用动态规划或直接用循环计算斐波那契数列。
下面是使用循环的方法: def rabbit(n): a, b = 1, 1 for i in range(2, n): a, b = b, a + b return b
n = int(input()) print(rabbit(n))
这个循环方法避免了递归的重复计算,效率更高。
